import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # ✅ 修改处：引入 seaborn 优化图形风格
import random

# ✅ 修改处：使用 seaborn 样式
sns.set(style="whitegrid", font='SimHei', font_scale=1.0)

# 设置负号正常显示
plt.rcParams['axes.unicode_minus'] = False

def read_dataset(file_path):
    """读取原始营商环境指标数据表（例如 AllIndexData.xlsx）"""
    return pd.read_excel(file_path)

def draw_bar_chart(x_data, y_data, title, x_label, y_label):
    """绘制水平条形图表示缺失占比"""
    sorted_indices = sorted(range(len(y_data)), key=lambda i: y_data[i])
    x_data = [x_data[i] for i in sorted_indices]
    y_data = [y_data[i] for i in sorted_indices]

    # ✅ 修改处：使用 seaborn 配色方案而非随机色
    colors = sns.color_palette("husl", len(x_data))

    plt.figure(figsize=(12, max(6, len(x_data) * 0.3)))  # ✅ 修改处：根据数据量动态调整图高
    bars = plt.barh(x_data, y_data, color=colors)

    plt.title(title, fontsize=14)  # ✅ 修改处：统一字号
    plt.xlabel(x_label, fontsize=12)
    plt.ylabel(y_label, fontsize=12)

    # ✅ 修改处：美化数据标签位置与格式
    for i, bar in enumerate(bars):
        width = bar.get_width()
        plt.text(width + 0.5, bar.get_y() + bar.get_height()/2,
                 f"{y_data[i]:.2f}%", va='center', fontsize=10)

    plt.tight_layout()
    plt.grid(axis='x', linestyle='--', alpha=0.6)  # ✅ 修改处：增加网格辅助线
    plt.show()

def save_to_csv(df, filename):
    """保存数据框为 CSV 文件"""
    try:
        df.to_csv(filename, index=True, encoding='utf-8-sig')
        print(f"✅ 文件已保存: {filename}")
    except Exception as e:
        print(f"❌ 保存失败: {e}")

def missing_value_analysis_overall(df):
    """所有指标整体缺失值统计"""
    cols = df.columns[3:-1]
    missing_ratios = (df[cols].isna().sum() / len(df)) * 100
    result = pd.DataFrame({'缺失值占比(%)': missing_ratios}, index=cols)
    draw_bar_chart(cols.tolist(), missing_ratios.tolist(), '所有指标缺失值占比', '缺失值占比 (%)', '指标名称')
    return result

def missing_value_analysis_by_country(df):
    """按国家统计缺失值占比"""
    cols = df.columns[3:-1]
    grouped = df.groupby('国名Ch')[cols]
    missing_ratios_by_country = (grouped.apply(lambda x: x.isna().sum()) / grouped.size().values.reshape(-1, 1)) * 100
    for country, ratios in missing_ratios_by_country.iterrows():
        draw_bar_chart(cols.tolist(), ratios.tolist(), f'{country} 缺失值占比', '缺失值占比 (%)', '指标名称')
    return missing_ratios_by_country

def missing_value_analysis_by_year(df):
    """按年份统计缺失值占比"""
    cols = df.columns[3:-1]
    grouped = df.groupby('Year')[cols]
    missing_ratios_by_year = (grouped.apply(lambda x: x.isna().sum()) / grouped.size().values.reshape(-1, 1)) * 100
    for year, ratios in missing_ratios_by_year.iterrows():
        draw_bar_chart(cols.tolist(), ratios.tolist(), f'{year} 年缺失值占比', '缺失值占比 (%)', '指标名称')
    return missing_ratios_by_year

def describe_missing_statistics(file_path):
    """对缺失值占比统计结果文件做描述性统计（读取 CSV）"""
    df = pd.read_csv(file_path, encoding='utf-8-sig')
    numeric_data = df.select_dtypes(include=[np.number])
    desc_stats = numeric_data.agg(['min', 'max', 'mean', 'std']).T
    desc_stats.columns = ['最小值', '最大值', '均值', '标准差']
    return desc_stats


#✅ 修改内容已用 # 修改处 标出

